Below is a collection of spatial datasets used in this project.

King County Boundary

King County Subdivision Boundary

Seattle Boundary

Tracts in King County

Although this assessment is primarily focused on three communities within the Seattle CCD subdivision of King County, one of the indicators (housing market conditions) uses neighboring tracts to determine displacement risk. Some of the neighboring tracts are part of other county subdivision, but rather than targeting just those specific tracts, this method collects data for all King County tracts and then runs the analysis on the appropriate subsets.

In the absence of a straight-forward method for identifying all the census tracts in the Seattle CCD subdivision of King County, it is possible to extract this information from American Factfinder. This tutorial describes how to use the American Factfinder interface to extract a list of all “all tracts within (or partially within) a census place”; substituting “county subdivision” for “place” will retrieve the desired results.

Tract boundaries sometimes change over time, particularly on years when the decennial census is conducted. While this project will primarily use the current set of boundaries, it is necessary to collect the tract boundaries of the 2000-2009 time period so that these datasets can be visually represented in choropleth diagrams.

King County Waterbodies

These are useful for “clipping” census geographies whose boundaries extend into waterbodies.

Census Geometries Without (Western) Waterbodies

The same four types of cenus geometries shown above (King County, Seattle CCD, City of Seattle, and all King county tracts) with the major waterbodies removed.

Mixed Census Geometries Simple Feature Object

Add a brief explanation of the sf package

Error in eval(expr, envir, enclos) : object 'kc_sf' not found
LS0tCmRmX3ByaW50OiB0aWJibGUKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICBwZGZfZG9jdW1lbnQ6CiAgICBrZWVwX3RleDogeWVzCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgpgYGB7ciBtaXNjLXNldHVwLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxjb21tZW50PUZBTFNFfQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KG9wZXJhdG9yLnRvb2xzKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHJwcm9qcm9vdCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmdkYWwpCmxpYnJhcnkoc3ApCmxpYnJhcnkocmdlb3MpCmxpYnJhcnkobWlzY2dpcykKbGlicmFyeSh0aWdyaXMpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGRvd25sb2FkZXIpCmxpYnJhcnkobWlzY2dpcykKbGlicmFyeShzZikKcm9vdCA8LSBycHJvanJvb3Q6OmlzX3JzdHVkaW9fcHJvamVjdApyb290X2ZpbGUgPC0gcm9vdCRtYWtlX2ZpeF9maWxlKCkKYGBgCgpgYGB7ciBtaXNjLWNvbG9yc30KZ3JlZW4gPC0gbWlzY2dpczo6bWlzY2dpc19wYWxzJHRhYmxlYXVfY2F0W1siZ3JlZW4iXV0KYmx1ZSA8LSBtaXNjZ2lzOjptaXNjZ2lzX3BhbHMkdGFibGVhdV9jYXRbWyJibHVlIl1dCm9yYW5nZSA8LSBtaXNjZ2lzOjptaXNjZ2lzX3BhbHMkdGFibGVhdV9jYXRbWyJvcmFuZ2UiXV0KcmVkIDwtIG1pc2NnaXM6Om1pc2NnaXNfcGFscyR0YWJsZWF1X2NhdFtbInJlZCJdXQp0ZWFsIDwtIG1pc2NnaXM6Om1pc2NnaXNfcGFscyR0YWJsZWF1X2NhdFtbInRlYWwiXV0KcGFsX3JnYl80IDwtIG1pc2NnaXM6Om1pc2NnaXNfcGFscyR0YWJsZWF1X2NhdFtjKCJyZWQiLCJnb2xkIiwiZ3JlZW4iLCJibHVlIildICU+JSB1bmxpc3QgJT4lIHBhbGV0dGUoKQpwYWxfcmdiXzQgPC0gbWlzY2dpczo6bWlzY2dpc19wYWxzJHRhYmxlYXVfY2F0W2MoInJlZCIsImdvbGQiLCJncmVlbiIsImJsdWUiKV0gJT4lIHVubGlzdCAlPiUgcGFsZXR0ZSgpCnBhbF9yZ2JfNiA8LSBtaXNjZ2lzOjptaXNjZ2lzX3BhbHMkdGFibGVhdV9jYXRbYygicmVkIiwiZ29sZCIsImdyZWVuIiwiYmx1ZSIsIm9yYW5nZSIsInB1cnBsZSIpXSAlPiUgdW5saXN0ICU+JSBwYWxldHRlKCkKcGFsX3JnYl82IDwtIG1pc2NnaXM6Om1pc2NnaXNfcGFscyR0YWJsZWF1X2NhdFtjKCJyZWQiLCJnb2xkIiwiZ3JlZW4iLCJibHVlIiwib3JhbmdlIiwicHVycGxlIildICU+JSB1bmxpc3QgJT4lIHBhbGV0dGUoKQpgYGAKCkJlbG93IGlzIGEgY29sbGVjdGlvbiBvZiBzcGF0aWFsIGRhdGFzZXRzIHVzZWQgaW4gdGhpcyBwcm9qZWN0LgoKIyMjIEtpbmcgQ291bnR5IEJvdW5kYXJ5CmBgYHtyIG1pc2Mta2MsIGZpZy5jYXA9IktpbmcgQ291bnR5XCdzIGdlb2dyYXBoaWMgYm91bmRhcnkifQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnLi8xLWRhdGEvNC1pbnRlcmltL2tjLW5vY2xpcC1zZi5yZHMnKSkpewogICAgICAgIHRpZ3Jpczo6Y291bnRpZXMoc3RhdGUgPSAiNTMiKSAlPiUgCiAgICAgICAgICAgICAgICBzdF9hc19zZigpICU+JSAKICAgICAgICAgICAgICAgIHN0X3RyYW5zZm9ybShjcnNfcHJvakBwcm9qYXJncykgJT4lIAogICAgICAgICAgICAgICAgc3RfY2FzdCgnTVVMVElQT0xZR09OJykgJT4lIAogICAgICAgICAgICAgICAgZmlsdGVyKE5BTUUgJWluJSAnS2luZycpICU+JSAKICAgICAgICAgICAgICAgIHdyaXRlX3Jkcyhyb290X2ZpbGUoJy4vMS1kYXRhLzQtaW50ZXJpbS9rYy1ub2NsaXAtc2YucmRzJykpCn0KCmtjX25vY2xpcF9zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJy4vMS1kYXRhLzQtaW50ZXJpbS9rYy1ub2NsaXAtc2YucmRzJykpCgpteUxmbHRHcmV5KGRhdGEgPSBhcyhrY19ub2NsaXBfc2YsJ1NwYXRpYWwnKSkgJT4lIAogICAgICAgIG15TGZsdE9wdHMoKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoY29sb3IgPSByZWQsb3BhY2l0eSA9IDEsZmlsbENvbG9yID0gcmVkLGZpbGxPcGFjaXR5ID0gLjUpCmBgYAoKCiMjIyBLaW5nIENvdW50eSBTdWJkaXZpc2lvbiBCb3VuZGFyeSB7LX0KCmBgYHtyIG1pc2Mtc2VhLWNjZCwgZmlnLmNhcD0iU2VhdHRsZSBTdWJkaXZpc2lvbiBvZiBLaW5nIENvdW50eVwncyBnZW9ncmFwaGljIGJvdW5kYXJ5In0KCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vc2VhdHRsZS1jY2Qtbm9jbGlwLXNmLnJkcycpKSl7CiAgICAgICAgdGlncmlzOjpjb3VudHlfc3ViZGl2aXNpb25zKHN0YXRlID0gIjUzIixjb3VudHkgPSAiMDMzIikgJT4lIAogICAgICAgICAgICAgICAgc3RfYXNfc2YoKSAlPiUgCiAgICAgICAgICAgICAgICBzdF90cmFuc2Zvcm0oY3JzX3Byb2pAcHJvamFyZ3MpICU+JSAKICAgICAgICAgICAgICAgIHN0X2Nhc3QoJ01VTFRJUE9MWUdPTicpICU+JSAKICAgICAgICAgICAgICAgIGZpbHRlcihOQU1FICVpbiUgIlNlYXR0bGUiKSAlPiUgCiAgICAgICAgICAgICAgICBtdXRhdGUoTkFNRSA9ICdTZWF0dGxlIENDRCcpICU+JSAKICAgICAgICAgICAgICAgIHdyaXRlX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vc2VhdHRsZS1jY2Qtbm9jbGlwLXNmLnJkcycpKQp9CgpzZWFfY2NkX25vY2xpcF9zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vc2VhdHRsZS1jY2Qtbm9jbGlwLXNmLnJkcycpKQoKbXlMZmx0R3JleShkYXRhID0gYXMoc2VhX2NjZF9ub2NsaXBfc2YsJ1NwYXRpYWwnKSkgJT4lIAogICAgICAgIG15TGZsdE9wdHMoKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoY29sb3IgPSBibHVlLG9wYWNpdHkgPSAxLGZpbGxDb2xvciA9IGJsdWUsZmlsbE9wYWNpdHkgPSAuNSkKCmBgYAoKCiMjIyBTZWF0dGxlIEJvdW5kYXJ5IHstfQoKYGBge3IgbWlzYy1zZWEtYm91bmQsIGZpZy5jYXA9IlNlYXR0bGVcJ3MgZ2VvZ3JhcGhpYyBib3VuZGFyeSJ9CgppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3NlYXR0bGUtbm9jbGlwLXNmLnJkcycpKSl7CiAgICAgICAgdGlncmlzOjpwbGFjZXMoc3RhdGUgPSAiV0EiKSAlPiUKICAgICAgICAgICAgICAgIHRpZ3Jpczo6ZmlsdGVyX3BsYWNlKHBsYWNlID0gIlNlYXR0bGUiKSAlPiUKICAgICAgICAgICAgICAgIHN0X2FzX3NmKCkgJT4lIAogICAgICAgICAgICAgICAgc3RfdHJhbnNmb3JtKGNyc19wcm9qQHByb2phcmdzKSAlPiUgCiAgICAgICAgICAgICAgICBzdF9jYXN0KCdNVUxUSVBPTFlHT04nKSAlPiUgCiAgICAgICAgICAgICAgICB3cml0ZV9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3NlYXR0bGUtbm9jbGlwLXNmLnJkcycpKQogICAgICAgIAp9CgpzZWFfbm9jbGlwX3NmIDwtIHJlYWRfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS9zZWF0dGxlLW5vY2xpcC1zZi5yZHMnKSkKCmdyZWVuIDwtIG1pc2NnaXM6Om1pc2NnaXNfcGFscyR0YWJsZWF1X2NhdFtbImdyZWVuIl1dCgpteUxmbHRHcmV5KGRhdGEgPSBhcyhzZWFfbm9jbGlwX3NmLCdTcGF0aWFsJykpICU+JSAKICAgICAgICBteUxmbHRPcHRzKCkgJT4lIAogICAgICAgIGFkZFBvbHlnb25zKGNvbG9yID0gZ3JlZW4sb3BhY2l0eSA9IDEsZmlsbENvbG9yID0gZ3JlZW4sZmlsbE9wYWNpdHkgPSAuNSkKCmBgYAoKCiMjIyBUcmFjdHMgaW4gS2luZyBDb3VudHkgey19CkFsdGhvdWdoIHRoaXMgYXNzZXNzbWVudCBpcyBwcmltYXJpbHkgZm9jdXNlZCBvbiB0aHJlZSBjb21tdW5pdGllcyB3aXRoaW4gdGhlIFNlYXR0bGUgQ0NEIHN1YmRpdmlzaW9uIG9mIEtpbmcgQ291bnR5LCBvbmUgb2YgdGhlIGluZGljYXRvcnMgKGhvdXNpbmcgbWFya2V0IGNvbmRpdGlvbnMpIHVzZXMgbmVpZ2hib3JpbmcgdHJhY3RzIHRvIGRldGVybWluZSBkaXNwbGFjZW1lbnQgcmlzay4gU29tZSBvZiB0aGUgbmVpZ2hib3JpbmcgdHJhY3RzIGFyZSBwYXJ0IG9mIG90aGVyIGNvdW50eSBzdWJkaXZpc2lvbiwgYnV0IHJhdGhlciB0aGFuIHRhcmdldGluZyBqdXN0IHRob3NlIHNwZWNpZmljIHRyYWN0cywgdGhpcyBtZXRob2QgY29sbGVjdHMgZGF0YSBmb3IgYWxsIEtpbmcgQ291bnR5IHRyYWN0cyBhbmQgdGhlbiBydW5zIHRoZSBhbmFseXNpcyBvbiB0aGUgYXBwcm9wcmlhdGUgc3Vic2V0cy4KCkluIHRoZSBhYnNlbmNlIG9mIGEgc3RyYWlnaHQtZm9yd2FyZCBtZXRob2QgZm9yIGlkZW50aWZ5aW5nIGFsbCB0aGUgY2Vuc3VzIHRyYWN0cyBpbiB0aGUgU2VhdHRsZSBDQ0Qgc3ViZGl2aXNpb24gb2YgS2luZyBDb3VudHksIGl0IGlzIHBvc3NpYmxlIHRvIGV4dHJhY3QgdGhpcyBpbmZvcm1hdGlvbiBmcm9tIFtBbWVyaWNhbiBGYWN0ZmluZGVyXShodHRwczovL2ZhY3RmaW5kZXIuY2Vuc3VzLmdvdi9mYWNlcy9uYXYvanNmL3BhZ2VzL2luZGV4LnhodG1sKS4gVGhpcyBbdHV0b3JpYWxdKGh0dHBzOi8vYXNrLmNlbnN1cy5nb3YvcHJ3ZWIvUFJTZXJ2bGV0Q3VzdG9tP3B5QWN0aXZpdHk9cHlNb2JpbGVTbmFwU3RhcnQmQWN0aW9uPXNob3dIYXJuZXNzJlB1cnBvc2U9S01IZWxwU2l0ZVBvcnRhbCZjbGFzc05hbWU9RGF0YS1Qb3J0YWwmUmVhZE9ubHk9dHJ1ZSZwek1vYmlsZUluaXRBY3Rpdml0eT1LTUZldGNoQXJ0aWNsZUV4dGVybmFsJnB6TW9iaWxlSW5pdEFjdGl2aXR5UGFyYW1zPSUyNkFydGljbGVJRCUzREtDUC0zMjU2JnB6TW9iaWxlQ29udGV4dFBhZ2VOYW1lPXB5RGlzcGxheUhhcm5lc3MpIGRlc2NyaWJlcyBob3cgdG8gdXNlIHRoZSBBbWVyaWNhbiBGYWN0ZmluZGVyIGludGVyZmFjZSB0byBleHRyYWN0IGEgbGlzdCBvZiBhbGwgImFsbCB0cmFjdHMgd2l0aGluIChvciBwYXJ0aWFsbHkgd2l0aGluKSBhIGNlbnN1cyBwbGFjZSI7IHN1YnN0aXR1dGluZyAiY291bnR5IHN1YmRpdmlzaW9uIiBmb3IgInBsYWNlIiB3aWxsIHJldHJpZXZlIHRoZSBkZXNpcmVkIHJlc3VsdHMuCgpUcmFjdCBib3VuZGFyaWVzIHNvbWV0aW1lcyBjaGFuZ2Ugb3ZlciB0aW1lLCBwYXJ0aWN1bGFybHkgb24geWVhcnMgd2hlbiB0aGUgZGVjZW5uaWFsIGNlbnN1cyBpcyBjb25kdWN0ZWQuIFdoaWxlIHRoaXMgcHJvamVjdCB3aWxsIHByaW1hcmlseSB1c2UgdGhlIGN1cnJlbnQgc2V0IG9mIGJvdW5kYXJpZXMsIGl0IGlzIG5lY2Vzc2FyeSB0byBjb2xsZWN0IHRoZSB0cmFjdCBib3VuZGFyaWVzIG9mIHRoZSAyMDAwLTIwMDkgdGltZSBwZXJpb2Qgc28gdGhhdCB0aGVzZSBkYXRhc2V0cyBjYW4gYmUgdmlzdWFsbHkgcmVwcmVzZW50ZWQgaW4gY2hvcm9wbGV0aCBkaWFncmFtcy4KCmBgYHtyIG1pc2MtdHIta2Mtbm9jbGlwLCBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD0yLCBmaWcuc2hvdz0naG9sZCcsIGRwaT0xNTB9CiMgMjAxNSB0cmFjdCBib3VuZGFyaWVzCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdHIta2Mtbm9jbGlwLTIwMTUtc2YucmRzJykpKXsKICAgICAgICAKICAgICAgICAjIFNlYXR0bGUgQ0NEIHRyYWN0cyAKICAgICAgICAjIE5vdGU6IGJlY2F1c2UgdGhpcyBzZWxlY3Rpb24gaW5jbHVkZXMgYWxsIHRyYWN0cyAid2l0aGluIG9yIHBhcnRpYWxseS13aXRoaW4iIHRoZSBTZWF0dGxlIENDLAogICAgICAgICMgc2V2ZXJhbCB0cmFjdCBHRU9JRHMgYXJlIGR1cGxpY2F0ZWQgaW4gdGhlIHNlbGVjdGlvbi4gRm9yIHRoZSBzYWtlIG9mIGNsYXJpdHksIHRoZXNlIGR1cGxpY2F0ZXMKICAgICAgICAjIGFyZSByZW1vdmVkIGZyb20gdGhlIGZpbmFsIHZlY3RvciBvZiBHRU9JRHMuCiAgICAgICAgdHJfY2NkX2dlb2lkXzIwMTIgPC0gCiAgICAgICAgICAgICAgICByZWFkX2NzdigKICAgICAgICAgICAgICAgICAgICAgICAgcm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvc2VhdHRsZS1jY2QvQUNTXzEyXzVZUl9CMDEwMDEvQUNTXzEyXzVZUl9CMDEwMDFfd2l0aF9hbm4uY3N2JyksIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKE5FV19HRU9JRDEgPSBzdHJfc3ViKElkMiwxLDUpLAogICAgICAgICAgICAgICAgICAgICAgIE5FV19HRU9JRDIgPSBzdHJfc3ViKElkMiwxNiwyMSksCiAgICAgICAgICAgICAgICAgICAgICAgR0VPSUQgPSBwYXN0ZTAoTkVXX0dFT0lEMSxORVdfR0VPSUQyKSwKICAgICAgICAgICAgICAgICAgICAgICBVTklRVUUgPSAhZHVwbGljYXRlZChHRU9JRCkpICU+JQogICAgICAgICAgICAgICAgZmlsdGVyKFVOSVFVRSkgJT4lIAogICAgICAgICAgICAgICAgZXh0cmFjdDIoJ0dFT0lEJykKICAgICAgICAKICAgICAgICAKICAgICAgICAjIEFsbCAyMDE1IEtDIHRyYWN0cyB3aXRoIFNlYXR0bGUgQ0NEIHN1YmRpdmlzaW9uIGNvbHVtbgogICAgICAgIAogICAgICAgIHRpZ3Jpczo6dHJhY3RzKHN0YXRlID0gJzUzJyxjb3VudHkgPSAnMDMzJywgeWVhciA9IDIwMTUpICU+JQogICAgICAgICAgICAgICAgc3RfYXNfc2YoKSAlPiUgCiAgICAgICAgICAgICAgICBzdF90cmFuc2Zvcm0oY3JzX3Byb2pAcHJvamFyZ3MpICU+JSAKICAgICAgICAgICAgICAgIHN0X2Nhc3QoJ01VTFRJUE9MWUdPTicpICU+JSAKICAgICAgICAgICAgICAgIG11dGF0ZShTRUFDQ0RfTEdMID0gaWZlbHNlKEdFT0lEICVpbiUgdHJfY2NkX2dlb2lkXzIwMTIsVFJVRSxGQUxTRSkpICU+JSAKICAgICAgICAgICAgICAgIHdyaXRlX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdHIta2Mtbm9jbGlwLTIwMTUtc2YucmRzJykpCiAgICAgICAgICAgICAgCn0KCiMgcHJlLTIwMTAgdHJhY3QgYm91bmRhcmllcwppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3RyLWtjLW5vY2xpcC0yMDA5LXNmLnJkcycpKSl7CiAgICAgICAgCiAgICAgICAgIyBTZWF0dGxlIENDRCB0cmFjdHMgCiAgICAgICAgIyBOb3RlOiBiZWNhdXNlIHRoaXMgc2VsZWN0aW9uIGluY2x1ZGVzIGFsbCB0cmFjdHMgIndpdGhpbiBvciBwYXJ0aWFsbHktd2l0aGluIiB0aGUgU2VhdHRsZSBDQywKICAgICAgICAjIHNldmVyYWwgdHJhY3QgR0VPSURzIGFyZSBkdXBsaWNhdGVkIGluIHRoZSBzZWxlY3Rpb24uIEZvciB0aGUgc2FrZSBvZiBjbGFyaXR5LCB0aGVzZSBkdXBsaWNhdGVzCiAgICAgICAgIyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmaW5hbCB2ZWN0b3Igb2YgR0VPSURzLgogICAgICAgIHRyX2NjZF9nZW9pZF8yMDA5IDwtIAogICAgICAgICAgICAgICAgcmVhZF9jc3YoCiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL3NlYXR0bGUtY2NkL0FDU18wOV81WVJfQjAxMDAxL0FDU18wOV81WVJfQjAxMDAxX3dpdGhfYW5uLmNzdicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhHRU8uaWQyID0gY29sX2NoYXJhY3RlcigpKSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKE5FV19HRU9JRDEgPSBzdHJfc3ViKEdFTy5pZDIsMSw1KSwKICAgICAgICAgICAgICAgICAgICAgICBORVdfR0VPSUQyID0gc3RyX3N1YihHRU8uaWQyLDE2LDIxKSwKICAgICAgICAgICAgICAgICAgICAgICBHRU9JRCA9IHBhc3RlMChORVdfR0VPSUQxLE5FV19HRU9JRDIpLAogICAgICAgICAgICAgICAgICAgICAgIFVOSVFVRSA9ICFkdXBsaWNhdGVkKEdFT0lEKSkgJT4lCiAgICAgICAgICAgICAgICBmaWx0ZXIoVU5JUVVFKSAlPiUgCiAgICAgICAgICAgICAgICBleHRyYWN0MignR0VPSUQnKQogICAgICAgIAogICAgICAgIAogICAgICAgICMgQWxsIDIwMTUgS0MgdHJhY3RzIHdpdGggU2VhdHRsZSBDQ0Qgc3ViZGl2aXNpb24gY29sdW1uCiAgICAgICAgCiAgICAgICAgbXlfZGxfemlwIDwtIGZ1bmN0aW9uKHVybCxkaXJfZmlsZXBhdGgpewogICAgICAgICAgICAgICAgdGVtcCA8LSB0ZW1wZmlsZSgpCiAgICAgICAgICAgICAgICBkb3dubG9hZGVyOjpkb3dubG9hZCh1cmwsIGRlc3QgPSB0ZW1wLCBtb2RlPSd3YicpCiAgICAgICAgICAgICAgICB1bnppcCh0ZW1wLCBleGRpciA9IGRpcl9maWxlcGF0aCkKICAgICAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICAjIG15X2RsX3ppcCgnZnRwOi8vZnRwLmNlbnN1cy5nb3YvZ2VvL3RpZ2VyL1RJR0VSMjAwOS81M19XQVNISU5HVE9OLzUzMDMzX0tpbmdfQ291bnR5L3RsXzIwMDlfNTMwMzNfdHJhY3QwMC56aXAnLHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL2tjLXRyLycpKQoKCiAgICAgICAgcmVhZE9HUihkc24gPSByb290X2ZpbGUoJy4vMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL2tjLXRyL3RsXzIwMDlfNTMwMzNfdHJhY3QwMC8nKSwKICAgICAgICAgICAgICAgIGxheWVyID0gJ3RsXzIwMDlfNTMwMzNfdHJhY3QwMCcsCiAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICU+JSAKICAgICAgICAgICAgICAgIHN0X2FzX3NmKCkgJT4lIAogICAgICAgICAgICAgICAgc3RfdHJhbnNmb3JtKGNyc19wcm9qQHByb2phcmdzKSAlPiUgCiAgICAgICAgICAgICAgICBzdF9jYXN0KCdNVUxUSVBPTFlHT04nKSAlPiUgCiAgICAgICAgICAgICAgICBtdXRhdGUoU0VBQ0NEX0xHTCA9IGlmZWxzZShDVElERlAwMCAlaW4lIHRyX2NjZF9nZW9pZF8yMDA5LFRSVUUsRkFMU0UpKSAlPiUgCiAgICAgICAgICAgICAgICB3cml0ZV9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3RyLWtjLW5vY2xpcC0yMDA5LXNmLnJkcycpKQogICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgIyBOb3RlOiB0aGUgYHRpZ3Jpc2AgcGFja2FnZSBpcyByZXR1cm5pbmcgYW4gZXJyb3IgZm9yIGF0dGVtcHRzIHRvCiAgICAgICAgIyBkb3dubG9hZCB0cmFjdCBkYXRhIGJlZm9yZSAyMDExCiAgICAgICAgIyB0aWdyaXM6OnRyYWN0cyhzdGF0ZSA9ICc1MycsY291bnR5ID0gJzAzMycsIHllYXIgPSAyMDA5KSAlPiUKICAgICAgICAjICAgICAgICAgc3BUcmFuc2Zvcm0oQ1JTb2JqID0gY3JzX3Byb2opICU+JQogICAgICAgICMgICAgICAgICBzdF9hc19zZigpICU+JQogICAgICAgICMgICAgICAgICBzdF9jYXN0KCdNVUxUSVBPTFlHT04nKSAlPiUKICAgICAgICAjICAgICAgICAgbXV0YXRlKFNFQUNDRF9MR0wgPSBpZmVsc2UoR0VPSUQgJWluJSB0cl9jY2RfZ2VvaWRfMjAxMixUUlVFLEZBTFNFKSkgJT4lCiAgICAgICAgIyAgICAgICAgIHdyaXRlX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdHIta2Mtd3RyLTIwMDktc2YucmRzJykpCiAgICAgICAgCn0KCgp0cl9rY19ub2NsaXBfMjAxNV9zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdHIta2Mtbm9jbGlwLTIwMTUtc2YucmRzJykpCgp0cl9rY19ub2NsaXBfMjAwOV9zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdHIta2Mtbm9jbGlwLTIwMDktc2YucmRzJykpCgpzaG93X3RyX2NjZF9ub2NsaXBfMjAwOV9zZiA8LSBmdW5jdGlvbigpewogICAgICAgIAogICAgICAgIGJsdWVfb3JhbmdlIDwtIGMoYmx1ZSxvcmFuZ2UpICU+JSB1bmxpc3QKICAgICAgICAKICAgICAgICBwYWwgPC0gY29sb3JGYWN0b3IoYmx1ZV9vcmFuZ2UsbGV2ZWxzID0gYyhUUlVFLEZBTFNFKSwgb3JkZXJlZCA9IFRSVUUpCiAgICAgICAgCiAgICAgICAgbXlMZmx0R3JleSgpICU+JSAKICAgICAgICAgICAgICAgIG15TGZsdE9wdHMoKSAlPiUgCiAgICAgICAgICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gYXModHJfa2Nfbm9jbGlwXzIwMDlfc2YsIlNwYXRpYWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB+IHBhbChTRUFDQ0RfTEdMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfiBwYWwoU0VBQ0NEX0xHTCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC41KSAlPiUgCiAgICAgICAgICAgICAgICBhZGRMZWdlbmQocG9zaXRpb24gPSAnYm90dG9tcmlnaHQnLGNvbG9ycyA9IGJsdWVfb3JhbmdlLGxhYmVscyA9IGMoJ1NlYXR0bGUgQ0NEJywnT3RoZXIgVHJhY3RzJyksdGl0bGUgPSAncHJlLTIwMTAnKSAlPiUgCiAgICAgICAgICAgICAgICBtaXNjZ2lzOjpzdHlsZVdpZGdldChzdHlsZSA9ICJmbG9hdDpsZWZ0O21hcmdpbjoxcHgiKQp9CnNob3dfdHJfY2NkX25vY2xpcF8yMDE1X3NmIDwtIGZ1bmN0aW9uKCl7CiAgICAgICAgCiAgICAgICAgYmx1ZV9vcmFuZ2UgPC0gYyhibHVlLG9yYW5nZSkgJT4lIHVubGlzdAogICAgICAgIAogICAgICAgIHBhbCA8LSBjb2xvckZhY3RvcihibHVlX29yYW5nZSxsZXZlbHMgPSBjKFRSVUUsRkFMU0UpLCBvcmRlcmVkID0gVFJVRSkKICAgICAgICAKICAgICAgICBteUxmbHRHcmV5KCkgJT4lIAogICAgICAgICAgICAgICAgbXlMZmx0T3B0cygpICU+JSAKICAgICAgICAgICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBhcyh0cl9rY19ub2NsaXBfMjAxNV9zZiwiU3BhdGlhbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IH4gcGFsKFNFQUNDRF9MR0wpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+IHBhbChTRUFDQ0RfTEdMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjUpICU+JSAKICAgICAgICAgICAgICAgIGFkZExlZ2VuZChwb3NpdGlvbiA9ICdib3R0b21yaWdodCcsY29sb3JzID0gYmx1ZV9vcmFuZ2UsbGFiZWxzID0gYygnU2VhdHRsZSBDQ0QnLCdPdGhlciBUcmFjdHMnKSx0aXRsZSA9ICcyMDEwJykgJT4lIAogICAgICAgICAgICAgICAgbWlzY2dpczo6c3R5bGVXaWRnZXQoc3R5bGUgPSAiZmxvYXQ6bm9uZTttYXJnaW46MXB4IikKfQoKCnNob3dfdHJfY2NkX25vY2xpcF8yMDA5X3NmKCkKc2hvd190cl9jY2Rfbm9jbGlwXzIwMTVfc2YoKQoKCmBgYAoKIyMjIEtpbmcgQ291bnR5IFdhdGVyYm9kaWVzIHstfQoKVGhlc2UgYXJlIHVzZWZ1bCBmb3IgImNsaXBwaW5nIiBjZW5zdXMgZ2VvZ3JhcGhpZXMgd2hvc2UgYm91bmRhcmllcyBleHRlbmQgaW50byB3YXRlcmJvZGllcy4KCmBgYHtyIG1pc2Mtd3RyLCBmaWcuY2FwPSJQdWdldCBTb3VuZCB3YXRlcmJvZGllcyJ9CgppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3d0ci1zZi5yZHMnKSkpewogICAgICAgIGZwX3d0ciA8LSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL05IRE1ham9yLmdkYicpCgojIGNoZWNrIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpZiBub3QgdGhlbiBkb3dubG9hZCBpdAppZighZmlsZS5leGlzdHMoZnBfd3RyKSl7CiAgICAgICAgCiAgICAgICAgdXJsIDwtICJmdHA6Ly93d3cuZWN5LndhLmdvdi9naXNfYS9pbmxhbmRXYXRlcnMvTkhEL05IRG1ham9yLmdkYi56aXAiICMgc2F2ZSB0aGUgVVJMIGZvciB0aGUgd2F0ZXJib2RpZXMgZGF0YQogICAgICAgIAogICAgICAgIHRlbXAgPC0gdGVtcGZpbGUoKSAjIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHRvIGhvbGQgdGhlIGNvbXByZXNzZWQgZG93bmxvYWQKICAgICAgICAKICAgICAgICBkb3dubG9hZCh1cmwsIGRlc3QgPSB0ZW1wLCBtb2RlPSJ3YiIpICMgZG93bmxvYWQgdGhlIGZpbGUKICAgICAgICAKICAgICAgICB1bnppcCAodGVtcCwgZXhkaXIgPSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsLycpKSAjIGV4dHJhY3QgdGhlIEVTUkkgZ2VvZGF0YWJhc2UgZmlsZSB0byBhIHByb2plY3QgZm9sZGVyCn0KCnd0cl9zZiA8LQogICAgICAgIHN1cHByZXNzV2FybmluZ3MocmVhZE9HUihkc24gPSBmcF93dHIsICAgICAgIyBjcmVhdGUgYSB3YXRlcmJvZGllcyBzaGFwZQogICAgICAgICAgICAgICAgbGF5ZXIgPSAiTkhEX01ham9yV2F0ZXJib2RpZXMiLHZlcmJvc2UgPSBGQUxTRSxwb2ludERyb3BaID0gVFJVRSkpICU+JQogICAgICAgIGdCdWZmZXIoYnlpZD1UUlVFLCB3aWR0aD0wKSAlPiUgIyBjbGVhbiB1cCBzZWxmLWludGVyc2VjdGluZyBwb2x5Z29ucwogICAgICAgIHNwVHJhbnNmb3JtKENSU29iaiA9IGNyc19wcm9qKSAlPiUgICAjIHRyYW5zZm9ybSB0aGUgcHJvamVjdGlvbiB0byBtYXRjaCB0aGUgcHJvamVjdCBwcm9qZWN0aW9uCiAgICAgICAgc3RfYXNfc2YoKSAlPiUgCiAgICAgICAgc3RfY2FzdCgnTVVMVElQT0xZR09OJykKCnd0cl9rY19zZiA8LSAKICAgICAgICB3dHJfc2YgJT4lIAogICAgICAgIHN0X2ludGVyc2VjdHMoeCA9IGtjX3NmLHkgPSAuKSAlPiUgCiAgICAgICAgdW5saXN0KHVzZS5uYW1lcyA9IEYpICU+JSAKICAgICAgICB3dHJfc2ZbLixdCgojIEFsbCBLaW5nIENvdW50eSB3YXRlcmJvZGllcwp3dHJfa2Nfc2YgJT4lIHdyaXRlX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vd3RyLWtjLXNmLnJkcycpKQoKIyBBbGwgd2F0ZXJib2RpZXMgbmVhciBTZWF0dGxlIENDRCAodGhlIFB1Z2V0IFNvdW5kIGFyZWEpCnd0cl9rY19zZiAlPiUgCiAgICAgICAgc3RfaW50ZXJzZWN0cyh4ID0gc2VhX2NjZF9zZix5ID0gLikgJT4lIAogICAgICAgIHVubGlzdCh1c2UubmFtZXMgPSBGKSAlPiUgCiAgICAgICAgd3RyX2tjX3NmWy4sXSAlPiUgCiAgICAgICAgd3JpdGVfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS93dHItcHVnZXQtc2YucmRzJykpCn0KCnd0cl9rY19zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vd3RyLWtjLXNmLnJkcycpKQoKd3RyX3B1Z2V0X3NmIDwtIHJlYWRfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS93dHItcHVnZXQtc2YucmRzJykpCgpzaG93X3d0cl9rYyA8LSBmdW5jdGlvbigpewogICAgICAgIG15TGZsdEdyZXkoZGF0YSA9IGFzKHd0cl9rY19zZiwnU3BhdGlhbCcpKSAlPiUgCiAgICAgICAgICAgICAgICBteUxmbHRPcHRzKCkgJT4lIAogICAgICAgICAgICAgICAgYWRkUG9seWdvbnMoY29sb3IgPSBibHVlLCBvcGFjaXR5ID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAuNSwgZmlsbENvbG9yID0gYmx1ZSxmaWxsT3BhY2l0eSA9IC41KSAgICAgICAgCn0KCnNob3dfd3RyX2tjKCkKCmBgYAoKIyMjIENlbnN1cyBHZW9tZXRyaWVzIFdpdGhvdXQgKFdlc3Rlcm4pIFdhdGVyYm9kaWVzIHstfQoKVGhlIHNhbWUgZm91ciB0eXBlcyBvZiBjZW51cyBnZW9tZXRyaWVzIHNob3duIGFib3ZlIChLaW5nIENvdW50eSwgU2VhdHRsZSBDQ0QsIENpdHkgb2YgU2VhdHRsZSwgYW5kIGFsbCBLaW5nIGNvdW50eSB0cmFjdHMpIHdpdGggdGhlIG1ham9yIHdhdGVyYm9kaWVzIHJlbW92ZWQuCgpgYGB7ciBtaXNjLWNsaXAtZ2VvbXN9CgojIENsaXAgS2luZyBDb3VudHkKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS9rYy1zZi5yZHMnKSkpewogICAgICAgIGtjX25vY2xpcF9zZiAlPiUgCiAgICAgICAgICAgICAgICBtdXRhdGUoZ2VvbSA9IHN0X2RpZmZlcmVuY2UoZ2VvbSwgc3RfdW5pb24od3RyX2tjX3NmKSkpICU+JSAKICAgICAgICAgICAgICAgIHdyaXRlX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2Mtc2YucmRzJykpCn0KCiMgQ2xpcCBTZWF0dGxlIENDRAppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3NlYXR0bGUtY2NkLXNmLnJkcycpKSl7CiAgICAgICAgc2VhX2NjZF9ub2NsaXBfc2YgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKGdlb20gPSBzdF9kaWZmZXJlbmNlKGdlb20sIHN0X3VuaW9uKHd0cl9rY19zZikpKSAlPiUgCiAgICAgICAgICAgICAgICBzdF9jYXN0KCdNVUxUSVBPTFlHT04nKSAlPiUgCiAgICAgICAgICAgICAgICB3cml0ZV9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3NlYXR0bGUtY2NkLXNmLnJkcycpKQp9CgojIENsaXAgU2VhdHRsZQppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3NlYXR0bGUtc2YucmRzJykpKXsKICAgICAgICBzZWFfbm9jbGlwX3NmICU+JSAKICAgICAgICAgICAgICAgIG11dGF0ZShnZW9tID0gc3RfZGlmZmVyZW5jZShnZW9tLCBzdF91bmlvbih3dHJfa2Nfc2YpKSkgJT4lIAogICAgICAgICAgICAgICAgc3RfY2FzdCgnTVVMVElQT0xZR09OJykgJT4lIAogICAgICAgICAgICAgICAgd3JpdGVfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS9zZWF0dGxlLXNmLnJkcycpKQp9CgojIENsaXAgS2luZyBDb3VudHkgdHJhY3RzICgyMDE1KQppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3RyLWtjLTIwMTUtc2YucmRzJykpKXsKICAgICAgICB0cl9rY19ub2NsaXBfMjAxNV9zZiAlPiUgCiAgICAgICAgICAgICAgICBmaWx0ZXIoVFJBQ1RDRSAlIWluJSAnOTkwMTAwJykgJT4lICMgcmVtb3ZlIHRoZSBQdWdldCBTb3VuZCB0cmFjdAogICAgICAgICAgICAgICAgbXV0YXRlKGdlb20gPSBzdF9kaWZmZXJlbmNlKGdlb20sIHN0X3VuaW9uKHd0cl9rY19zZikpKSAlPiUgCiAgICAgICAgICAgICAgICBzdF9jYXN0KCdNVUxUSVBPTFlHT04nKSAlPiUgCiAgICAgICAgICAgICAgICB3cml0ZV9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3RyLWtjLTIwMTUtc2YucmRzJykpCn0KCiMgQ2xpcCBLaW5nIENvdW50eSB0cmFjdHMgKDIwMDkpCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdHIta2MtMjAwOS1zZi5yZHMnKSkpewogICAgICAgIHRyX2tjX25vY2xpcF8yMDA5X3NmICU+JSAKICAgICAgICAgICAgICAgIGZpbHRlcihUUkFDVENFMDAgJSFpbiUgJzk5MDEwMCcpICU+JSAjIHJlbW92ZSB0aGUgUHVnZXQgU291bmQgdHJhY3QKICAgICAgICAgICAgICAgIG11dGF0ZShnZW9tID0gc3RfZGlmZmVyZW5jZShnZW9tLCBzdF91bmlvbih3dHJfa2Nfc2YpKSkgJT4lIAogICAgICAgICAgICAgICAgc3RfY2FzdCgnTVVMVElQT0xZR09OJykgJT4lIAogICAgICAgICAgICAgICAgd3JpdGVfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS90ci1rYy0yMDA5LXNmLnJkcycpKQp9CgpgYGAKCgpgYGB7ciBtaXNjLXNob3ctY2xpcHBlZC1nZW9tcy0xfQoKa2Nfc2YgPC0gcmVhZF9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2tjLXNmLnJkcycpKQoKc2VhX2NjZF9zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vc2VhdHRsZS1jY2Qtc2YucmRzJykpCgpzZWFfc2YgPC0gcmVhZF9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3NlYXR0bGUtc2YucmRzJykpCgpzaG93X2tjX3NmIDwtIGZ1bmN0aW9uKCl7CiAgICAgICAgbXlMZmx0R3JleShkYXRhID0gYXMoa2Nfc2YsJ1NwYXRpYWwnKSkgJT4lIAogICAgICAgICAgICAgICAgbXlMZmx0T3B0cygpICU+JSAKICAgICAgICAgICAgICAgIGFkZFBvbHlnb25zKGNvbG9yID0gcmVkLG9wYWNpdHkgPSAxLGZpbGxDb2xvciA9IHJlZCxmaWxsT3BhY2l0eSA9IC41KQp9CgpzaG93X3NlYV9jY2Rfc2YgPC0gZnVuY3Rpb24oKXsKICAgICAgICBteUxmbHRHcmV5KGRhdGEgPSBhcyhzZWFfY2NkX3NmLCdTcGF0aWFsJykpICU+JSAKICAgICAgICAgICAgICAgIG15TGZsdE9wdHMoKSAlPiUgCiAgICAgICAgICAgICAgICBhZGRQb2x5Z29ucyhjb2xvciA9IGJsdWUsb3BhY2l0eSA9IDEsZmlsbENvbG9yID0gYmx1ZSxmaWxsT3BhY2l0eSA9IC41KQp9CgpzaG93X3NlYV9zZiA8LSBmdW5jdGlvbigpewogICAgICAgIG15TGZsdEdyZXkoZGF0YSA9IGFzKHNlYV9zZiwnU3BhdGlhbCcpKSAlPiUgCiAgICAgICAgICAgICAgICBteUxmbHRPcHRzKCkgJT4lIAogICAgICAgICAgICAgICAgYWRkUG9seWdvbnMoY29sb3IgPSBncmVlbixvcGFjaXR5ID0gMSxmaWxsQ29sb3IgPSBncmVlbixmaWxsT3BhY2l0eSA9IC41KQp9CnNob3dfa2Nfc2YoKQpzaG93X3NlYV9jY2Rfc2YoKQpzaG93X3NlYV9zZigpCmBgYAoKCmBgYHtyIHNob3ctY2xpcHBlZC1nZW9tcy0yLCBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD0yLCBmaWcuc2hvdz0naG9sZCcsIGRwaT0xNTB9Cgp0cl9rY18yMDE1X3NmIDwtIHJlYWRfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS90ci1rYy0yMDE1LXNmLnJkcycpKQoKdHJfa2NfMjAwOV9zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdHIta2MtMjAwOS1zZi5yZHMnKSkKCnNob3dfdHJfa2NfMjAwOV9zZiA8LSBmdW5jdGlvbigpewogICAgICAgIAogICAgICAgIGJsdWVfb3JhbmdlIDwtIGMoYmx1ZSxvcmFuZ2UpICU+JSB1bmxpc3QKICAgICAgICAKICAgICAgICBwYWwgPC0gY29sb3JGYWN0b3IoYmx1ZV9vcmFuZ2UsbGV2ZWxzID0gYyhUUlVFLEZBTFNFKSwgb3JkZXJlZCA9IFRSVUUpCiAgICAgICAgCiAgICAgICAgbXlMZmx0R3JleSgpICU+JSAKICAgICAgICAgICAgICAgIG15TGZsdE9wdHMoKSAlPiUgCiAgICAgICAgICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gYXModHJfa2NfMjAwOV9zZiwiU3BhdGlhbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IH4gcGFsKFNFQUNDRF9MR0wpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+IHBhbChTRUFDQ0RfTEdMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjUpICU+JSAKICAgICAgICAgICAgICAgIGFkZExlZ2VuZChwb3NpdGlvbiA9ICdib3R0b21yaWdodCcsY29sb3JzID0gYmx1ZV9vcmFuZ2UsbGFiZWxzID0gYygnU2VhdHRsZSBDQ0QnLCdPdGhlciBUcmFjdHMnKSx0aXRsZSA9ICdwcmUtMjAxMCcpICU+JSAKICAgICAgICAgICAgICAgIG1pc2NnaXM6OnN0eWxlV2lkZ2V0KHN0eWxlID0gImZsb2F0OmxlZnQ7bWFyZ2luOjFweCIpCn0KCnNob3dfdHJfa2NfMjAxNV9zZiA8LSBmdW5jdGlvbigpewogICAgICAgIAogICAgICAgIGJsdWVfb3JhbmdlIDwtIGMoYmx1ZSxvcmFuZ2UpICU+JSB1bmxpc3QKICAgICAgICAKICAgICAgICBwYWwgPC0gY29sb3JGYWN0b3IoYmx1ZV9vcmFuZ2UsbGV2ZWxzID0gYyhUUlVFLEZBTFNFKSwgb3JkZXJlZCA9IFRSVUUpCiAgICAgICAgCiAgICAgICAgbXlMZmx0R3JleSgpICU+JSAKICAgICAgICAgICAgICAgIG15TGZsdE9wdHMoKSAlPiUgCiAgICAgICAgICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gYXModHJfa2NfMjAxNV9zZiwiU3BhdGlhbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IH4gcGFsKFNFQUNDRF9MR0wpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+IHBhbChTRUFDQ0RfTEdMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjUpICU+JSAKICAgICAgICAgICAgICAgIGFkZExlZ2VuZChwb3NpdGlvbiA9ICdib3R0b21yaWdodCcsY29sb3JzID0gYmx1ZV9vcmFuZ2UsbGFiZWxzID0gYygnU2VhdHRsZSBDQ0QnLCdPdGhlciBUcmFjdHMnKSx0aXRsZSA9ICcyMDEwJykgJT4lIAogICAgICAgICAgICAgICAgbWlzY2dpczo6c3R5bGVXaWRnZXQoc3R5bGUgPSAiZmxvYXQ6bm9uZTttYXJnaW46MXB4IikKfQoKc2hvd190cl9rY18yMDA5X3NmKCkKCnNob3dfdHJfa2NfMjAxNV9zZigpCgpgYGAKCgojIyMgTWl4ZWQgQ2Vuc3VzIEdlb21ldHJpZXMgU2ltcGxlIEZlYXR1cmUgT2JqZWN0CgpBZGQgYSBicmllZiBleHBsYW5hdGlvbiBvZiB0aGUgYHNmYCBwYWNrYWdlCgpgYGB7ciBtaXNjLWNvbWJpbmVkfQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnLi8xLWRhdGEvNC1pbnRlcmltL2Nvby1hY3MtMjAxNS1nZW9tcy1zZi5yZHMnKSkpewogICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICBrY19zZiAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChnZW9tKSAlPiUgbXV0YXRlKE5BTUUgPSAnS0MnLCBOQU1FX0ZVTEwgPSAnS2luZyBDb3VudHksIFdhc2hpbmd0b24nLEdFT0lENiA9IE5BX2NoYXJhY3Rlcl8sIFNFQUNDRF9MR0wgPSBOQSksCiAgICAgICAgICAgICAgICBzZWFfY2NkX3NmICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGdlb20pICU+JSBtdXRhdGUoTkFNRSA9ICdTRUFDQ0QnLCBOQU1FX0ZVTEwgPSAnU2VhdHRsZSBDQ0QsIEtpbmcgQ291bnR5LCBXYXNoaW5ndG9uJywgR0VPSUQ2ID0gTkFfY2hhcmFjdGVyXywgU0VBQ0NEX0xHTCA9IE5BKSwKICAgICAgICAgICAgICAgIHRyX2tjXzIwMTVfc2YgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoTkFNRSxOQU1FX0ZVTEwgPSBOQU1FTFNBRCxHRU9JRDYgPSBHRU9JRCxTRUFDQ0RfTEdMLGdlb20pICU+JSBtdXRhdGUoTkFNRV9GVUxMID0gcGFzdGUwKE5BTUVfRlVMTCwnLCBLaW5nIENvdW50eSwgV2FzaGluZ3RvbicpLEdFT0lENiA9IHN0cl9zdWIoR0VPSUQ2LDYsMTEpKQogICAgICAgICkgJT4lIAogICAgICAgICAgICAgICAgcmVkdWNlKHJiaW5kLnNmKSAlPiUKICAgICAgICAgICAgICAgIHdyaXRlX3Jkcyhyb290X2ZpbGUoJy4vMS1kYXRhLzQtaW50ZXJpbS9jb28tYWNzLTIwMTUtZ2VvbXMtc2YucmRzJykpCiAgICAgICAgCn0KCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJy4vMS1kYXRhLzQtaW50ZXJpbS9jb28tYWNzLTIwMDktZ2VvbXMtc2YucmRzJykpKXsKICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAga2Nfc2YgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZ2VvbSkgJT4lIG11dGF0ZShOQU1FID0gJ0tDJywgTkFNRV9GVUxMID0gJ0tpbmcgQ291bnR5LCBXYXNoaW5ndG9uJyxHRU9JRDYgPSBOQV9jaGFyYWN0ZXJfLCBTRUFDQ0RfTEdMID0gTkEpLAogICAgICAgICAgICAgICAgc2VhX2NjZF9zZiAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChnZW9tKSAlPiUgbXV0YXRlKE5BTUUgPSAnU0VBQ0NEJywgTkFNRV9GVUxMID0gJ1NlYXR0bGUgQ0NELCBLaW5nIENvdW50eSwgV2FzaGluZ3RvbicsIEdFT0lENiA9IE5BX2NoYXJhY3Rlcl8sIFNFQUNDRF9MR0wgPSBOQSksCiAgICAgICAgICAgICAgICB0cl9rY18yMDA5X3NmICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KE5BTUUgPSBOQU1FMDAsIE5BTUVfRlVMTCA9IE5BTUVMU0FEMDAsR0VPSUQ2ID0gVFJBQ1RDRTAwLFNFQUNDRF9MR0wsZ2VvbSkgJT4lIG11dGF0ZShOQU1FX0ZVTEwgPSBwYXN0ZTAoTkFNRV9GVUxMLCcsIEtpbmcgQ291bnR5LCBXYXNoaW5ndG9uJykpCiAgICAgICAgKSAlPiUgCiAgICAgICAgICAgICAgICByZWR1Y2UocmJpbmQuc2YpICU+JSAKICAgICAgICAgICAgICAgIHdyaXRlX3Jkcyhyb290X2ZpbGUoJy4vMS1kYXRhLzQtaW50ZXJpbS9jb28tYWNzLTIwMDktZ2VvbXMtc2YucmRzJykpCiAgICAgICAgCn0KCgpjb29fZ2VvbXNfMjAxNV9zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJy4vMS1kYXRhLzQtaW50ZXJpbS9jb28tYWNzLTIwMTUtZ2VvbXMtc2YucmRzJykpCgpjb29fZ2VvbXNfMjAwOV9zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJy4vMS1kYXRhLzQtaW50ZXJpbS9jb28tYWNzLTIwMDktZ2VvbXMtc2YucmRzJykpCgpwcmludChjb29fZ2VvbXNfMjAxNV9zZixuID0xMCkKCmBgYAoK